import { PieceType } from "./GameDefine"

/**
 * 走法检查器，检验走法是否合格
 */
const { ccclass, property } = cc._decorator

@ccclass
export default class MoveChecker extends cc.Component {

    start() { }

    /***********************************\
    * 正常移动规则
    \***********************************/
    // 检查位置p是否在左上角为[r,c]，大小为(h, w)的矩形区域中
    inRegion(p, l, s) {
        if (p.r >= l.r && p.r < l.r + s.h && p.c >= l.c && p.c < l.c + s.w) return true
        else return false
    }
    // 检查在棋盘b中，从p1到p2的最短曼哈顿路径上有多少个棋子，包括p1和p2点
    // (如果p1=p2，只计算一次)
    // 曼哈顿路径定义为先走斜线，再走直线的一条路径。
    countChess(board, p1, p2) {
        var cnt = 0
        var r = p1.r
        var c = p1.c

        while (r != p2.r || c != p2.c) {
            if (board[r][c] != null) cnt++
            if (p2.r > r) r++
            if (p2.r < r) r--
            if (p2.c > c) c++
            if (p2.c < c) c--
        }

        if (board[r][c] != null) cnt++

        return cnt
    }
    //给一个棋盘，检查是否能将在[old_row, old_col]当中的棋子移动到[new_row,new_col]作为合法的一步。
    // normalCheck(board: ChessPieces[][], old: { r: number, c: number }, now: { r: number, c: number }, player_id) {
    //     // 自己走向自己非法
    //     if (old.r == now.r && old.c == now.c) return false

    //     // 边界越界
    //     if (!this.inRegion(old, { r: 0, c: 0 }, { h: 10, w: 9 })) return false
    //     if (!this.inRegion(now, { r: 0, c: 0 }, { h: 10, w: 9 })) return false

    //     var s = board[old.r][old.c]
    //     var t = board[now.r][now.c]
    //     var cnt = this.countChess(board, now, old)

    //     // 起点没有棋子或是对方的子。
    //     if (s == null) return false
    //     if (s.player_id != player_id) return false

    //     // 路障太多
    //     if (cnt > 3) return false


    //     // 吃到自己的子
    //     if (t != null && s.player_id == t.player_id) return false

    //     // dx dy 有向距离
    //     // x y 无向距离
    //     var dr = now.r - old.r
    //     var dc = now.c - old.c
    //     var r = dr > 0 ? dr : -dr
    //     var c = dc > 0 ? dc : -dc
    //     // 将
    //     switch (s.type) {
    //         case PieceType.KING:
    //             if (s.player_id == 0 && !(this.inRegion(now, { r: 0, c: 3 }, { h: 3, w: 3 }))) return false
    //             if (s.player_id == 1 && !(this.inRegion(now, { r: 7, c: 3 }, { h: 3, w: 3 }))) return false
    //             if (!((r == 1 && c == 0) || (r == 0 && c == 1))) return false
    //             break
    //         case PieceType.MANDARIN:
    //             if (s.player_id == 0 && !(this.inRegion(now, { r: 0, c: 3 }, { h: 3, w: 3 }))) return false
    //             if (s.player_id == 1 && !(this.inRegion(now, { r: 7, c: 3 }, { h: 3, w: 3 }))) return false
    //             if (!(r == 1 && c == 1)) return false
    //             break
    //         case PieceType.ELEPHANT:
    //             // region
    //             if (s.player_id == 0 && !(this.inRegion(now, { r: 0, c: 0 }, { h: 5, w: 9 }))) return false
    //             if (s.player_id == 1 && !(this.inRegion(now, { r: 5, c: 0 }, { h: 5, w: 9 }))) return false

    //             if (!(r == 2 && c == 2)) return false
    //             if (cnt > 2) return false
    //             if (cnt == 2 && t == null) return false
    //             break
    //         case PieceType.ROOKS:
    //             if (r != 0 && c != 0) return false
    //             if (cnt > 2) return false
    //             if (cnt == 2 && t == null) return false
    //             break
    //         case PieceType.KNIGHTS:
    //             if (!((r == 1 && c == 2) || (r == 2 && c == 1))) return false
    //             if (cnt > 2) return false
    //             if (cnt == 2 && t == null) return false
    //             break
    //         case PieceType.CANNONS:
    //             if (r != 0 && c != 0) return false
    //             if (cnt == 3 && t == null) return false
    //             if (cnt == 2) return false
    //             break
    //         case PieceType.PAWNS:
    //             if (s.player_id == 0 && dr < 0) return false
    //             if (s.player_id == 1 && dr > 0) return false

    //             if (s.player_id == 0 && this.inRegion(now, { r: 0, c: 0 }, { h: 5, w: 9 })) {
    //                 if (c != 0) return false
    //                 if (r != 1) return false
    //             } else {
    //                 if (!((r == 0 && c == 1) || (r == 1 && c == 0))) return false
    //             }

    //             if (s.player_id == 1 && this.inRegion(now, { r: 5, c: 0 }, { h: 5, w: 9 })) {
    //                 if (c != 0) return false
    //                 if (r != 1) return false
    //             } else {
    //                 if (!((r == 0 && c == 1) || (r == 1 && c == 0))) return false
    //             }
    //             break
    //     }
    //     return true
    // }
}
